home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
util
/
cli
/
mkms_1_35.lha
/
mkms
/
mkms.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-21
|
15KB
|
510 lines
/*
* mkms: create a shell script to mail a specified list
* of files to a specified list of addresses with
* a specified list of subjects. with aliases in
* an rc file. do I sound confused?
*
* history:
* 30SEP94: begun, first usage, basically refitted 'mkfscript'
* to deal with the mail script instead of ftp.
* 05OCT94: added ability to have aliases for user@address
* 06OCT94: added the 'find single alias', 'list aliases'
* and the 'echo' options.
*
* Copyright (c)1994 by Eric R. Augustine. Absolute freeware - do
* with it what you wish except sell it or remove this copyright notice.
*
* I may be contacted via internet e-mail: gort@shell.portal.com
*/
#include <nlist.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define VERSION "1.35"
#define TRUE 1
#define FALSE 0
char *progname = "mkms";
char *rcfile = "/.mkmsrc";
typedef int bool;
bool listal = FALSE;
struct filestr {
char *destination;
char *message;
char *subject;
};
struct alias {
char *name;
char *real;
};
main(int argc, char *argv[]) {
FILE *ifp,*tfp,*ofp;
bool mkecho = FALSE;
bool geta = FALSE;
bool prout = FALSE;
bool stdprt = FALSE;
bool rdstdin = FALSE;
bool addlns = FALSE;
bool ignore = FALSE;
bool fsalias = FALSE;
bool mkftp = FALSE;
bool fdesc = FALSE;
char *infile,*outfile,*curstring,*filenm;
char *tempname, *site, *dstring, *repstr = NULL;
char *aliasf;
char buffer[BUFSIZ];
char *getalias(char *);
extern char *optarg;
extern int optind;
extern int opterr;
int c,d,cc,length,elength,flength,linecount,rcerror;
int scount = 0,fdelay = 1;
struct filestr entry;
struct stat stbuf,rcbuf;
struct alias al;
struct tm *local_time;
size_t dlen = 0;
time_t now, time();
void usage(void);
void error(char *, char *);
void listrc(void);
void findsinglealias(char *);
void pversion(void);
progname = argv[0]; /* whatever program renamed to */
if(argc < 2 ) { /* make sure minimal usage valid */
usage();
exit(1);
}
while((d = getopt(argc, argv, "acdelnsvFIf:o:i:S:")) != EOF) {
switch(d) {
case 'I': /* count output and print count */
ignore = TRUE;
break;
case 'l': /* list all the aliases */
listal = TRUE;
break;
case 'c': /* print to stdout */
ofp = stdout;
stdprt = TRUE;
break;
case 'e': /* add lines to make script echo */
mkecho= TRUE;
break;
case 'f': /* find an alias in the rc */
aliasf = optarg;
fsalias = TRUE;
break;
case 'n': /* how many lines and chars written */
prout = TRUE;
break;
case 's': /* read from stdin */
ifp = stdin;
rdstdin = TRUE;
break;
case 'a': /* append more lines */
addlns = TRUE;
break;
case 'F': /* make an ncftp script */
mkftp = TRUE;
break;
case 'v': /* print version and copyright info */
pversion();
exit(0);
break;
case 'o': /* get outfile */
outfile = optarg;
break;
case 'i': /* get infile */
infile = optarg;
break;
case 'd': /* add file descriptions for ftp scripts */
fdesc = TRUE;
break;
case 'S': /* get ftp site */
site = optarg;
break;
default: /* user error */
fprintf(stderr,"%s: unknown option '%c'\n",progname,d);
usage();
exit(2);
break;
}
}
argc -= optind;
argv += optind;
/* catch a few possible problems
*/
if(addlns)
stdprt = FALSE;
if(mkftp == FALSE)
fdesc = FALSE;
/* stat rcfile and set geta accordingly
*/
rcfile = strcat(getenv("HOME"),rcfile);
rcerror = stat(rcfile,&rcbuf);
if(rcerror == 0) {
geta = TRUE;
if((rcbuf.st_mode & S_IFMT) == S_IFDIR) {
error("your rc file is a directory, ignoring",rcfile);
if(listal)
exit(1);
geta = FALSE;
}
}
/* get the user's desired delay for ncftp scripts
*/
if((geta) && (mkftp)) {
repstr = getalias("fdelay");
if(repstr != NULL)
fdelay = atoi(strdup(repstr));
}
/* now that we have the user's delay time we
* can ignore the rc file.
*/
if(ignore)
geta = FALSE;
/* switch site for entry in rc file if exists
*/
if((geta) && (mkftp)) {
repstr = getalias(site);
if(repstr != NULL)
site = strdup(repstr);
}
/* list contents of rc file
*/
if(listal) {
if(geta) {
listrc();
exit(0);
}
else {
error("unable to access rc file.","");
exit(1);
}
}
/* find a single alias in the rcfile
*/
if(fsalias) {
if(geta) {
findsinglealias(aliasf);
exit(0);
}
else {
error("unable to access rc file.","");
exit(1);
}
}
/* open needed files for preprocess
*/
if(rdstdin);
else {
stat(infile,&stbuf); /* get file status */
if((stbuf.st_mode & S_IFMT) == S_IFDIR) { /* ooops, file is a directory */
error("named infile is a directory","");
exit(4); /* goon warrior */
}
if(!(ifp = fopen(infile,"r"))) { /* source file */
error("unable to open file",infile);
exit(2); /* user error */
}
}
tempname = tmpnam(NULL); /* create temp file */
if(!(tfp = fopen(tempname,"w"))) {
error("unable to open temporary file stream","");
exit(3); /* system error */
}
/* preprocess source file - remove all tabs and reduce
* multiple spaces to single spaces. this makes all
* input files equivalent.
*/
while((c = fgetc(ifp)) != EOF) {
if(c == '\t') {
if(scount < 1)
putc(' ',tfp);
scount++;
}
else if(c == ' ') {
if(scount < 1)
putc(' ',tfp);
scount++;
}
else if(c == '\n') {
scount = 0;
putc(c,tfp);
}
else {
scount = 0;
putc(c,tfp);
}
}
if(rdstdin);
else
fclose(ifp); /* close source file */
fclose(tfp); /* reopen temp stream */
if(!(tfp = fopen(tempname,"r"))) { /* with mode "read" */
error("unable to open temporary file stream","");
exit(3);
}
/* open output file based on command line opts
*/
if(stdprt); /* print to terminal */
else
/* append new lines to end of pre-existing file
*/
if(addlns) {
if(stat(outfile,&stbuf) == -1) /* is old file there? */
addlns = FALSE; /* no -> reset flag */
if((stbuf.st_mode & S_IFMT) == S_IFDIR) { /* ooops, file is a directory */
error("named outfile is a directory","");
exit(5); /* goon error */
}
if(!(ofp = fopen(outfile,"a"))) { /* open file mode append */
error("unable to open old file",outfile);
exit(1);
}
}
else {
stat(outfile,&stbuf); /* check filetype */
if((stbuf.st_mode & S_IFMT) == S_IFDIR) { /* file is a directory */
error("named outfile is a directory","");
exit(5); /* goon alert */
}
if(!(ofp = fopen(outfile,"w"))) { /* print to a new file */
error("unable to open outfile",outfile);
exit(1);
}
}
/* make the script file
*/
(void)time(&now); /* get date info for header */
local_time = localtime(&now);
dstring = asctime(local_time);
if(addlns == FALSE) {
cc = fprintf(ofp,"#!/bin/sh -f\n# generated by %s %s %s",progname,VERSION,dstring);
linecount = 2;
}
else if(addlns) {
cc = fprintf(ofp,"# added %s",dstring);
linecount = 2;
}
while((curstring = fgets(buffer,BUFSIZ,tfp)) != NULL) { /* parse lines */
entry.destination = strsep(&curstring," ");
entry.message = strsep(&curstring," ");
entry.subject = strsep(&curstring,"\n\0");
if(geta) {
repstr = getalias(entry.destination);
if(repstr != NULL)
entry.destination = strdup(repstr);
}
if((mkftp) && (fdesc))
flength = fprintf(ofp,"# %s: %s\n",entry.destination,entry.subject);
if((mkecho) && (mkftp == FALSE))
elength = fprintf(ofp,"echo \"sending %s to %s\" ;\n",entry.message,entry.destination);
if((mkecho) && (mkftp))
elength = fprintf(ofp,"echo \"getting %s/%s\" ;\n",site,entry.destination);
if(mkftp == FALSE)
length = fprintf(ofp,"mail -s \"%s\" %s < %s ;\n",entry.subject,entry.destination,entry.message);
if(mkftp) {
filenm = strdup(entry.destination);
filenm = strsep(&filenm,".");
length = fprintf(ofp,"ncftp >& ./%s.ncftp -d %d -r %s/%s/%s & ;\n",filenm,fdelay,site,entry.message,entry.destination);
}
if((prout) && (mkecho))
length += elength;
if((prout) && (fdesc))
length += flength;
if(prout) {
linecount ++;
if(fdesc)
linecount++;
if(mkecho)
linecount++;
cc += length + dlen;
}
}
if((prout) && (addlns == FALSE)) /* print info on made file */
fprintf(stderr,"characters: %d\n lines: %d\n",cc,linecount);
else
if((addlns == TRUE) && (prout == TRUE))
fprintf(stderr,"characters added: %d\n lines appended: %d\n",cc,linecount);
if(stdprt == FALSE) /* don't try to close stout */
fclose(ofp); /* close out file */
fclose(tfp);
remove(tempname);
}
/* a little instruction for the unknowing
*/
void usage() {
fprintf(stderr,"Usage: %s [-acdelnsvFI] [-f alias] [-i input] [-S site] [-o output]\n", progname);
return;
}
/* print version and copyright information
*/
void pversion(void) {
printf("mkms is free software. you may distribute copies of it as long as no\n");
printf("profit is made from such distribution. There is no warranty for mkms.\n");
printf("mkms %s Copyright (c)1994 by Eric R. Augustine.\n",VERSION);
return;
}
/* simple error messages
*/
void error(char *estring, char *fstring) {
fprintf(stderr,"%s: ERROR: %s %s\n", progname, estring, fstring);
return;
}
/* get aliases from rcfile
*/
char *getalias(char *s) {
FILE *rfp;
bool DONE = FALSE;
char buffer[BUFSIZ],*alstr,*retstr = NULL;
struct alias al;
if(!(rfp = fopen(rcfile,"r"))) {
error("unable to open rc file",rcfile);
}
else {
while((!feof(rfp) && (alstr = fgets(buffer,BUFSIZ,rfp)) != NULL) && !DONE) {
if(alstr[1] == '#'); /* eat comments and other garbage */
else
if(alstr[1] == ' ');
else
if(alstr[1] == '\n');
else
if(alstr[1] == '\t');
else
if(alstr[1] == '\0');
else {
al.name = strsep(&alstr," ");
al.real = strsep(&alstr,"\n\0");
if(strcmp(s,al.name) == 0) {
DONE = TRUE;
retstr = strdup(al.real);
}
}
}
}
if(rfp)
fclose(rfp);
return retstr;
}
/* list contents of rcfile
*/
void listrc() {
FILE *rfp;
char buffer[BUFSIZ],*alstr;
struct alias al;
printf("\nalias = real value\n");
printf("--------------------------------------------------------------\n");
if(!(rfp = fopen(rcfile,"r"))) {
error("unable to open rc file",rcfile);
}
else {
while((alstr = fgets(buffer,BUFSIZ,rfp)) != NULL) {
if(alstr[1] == '#'); /* eat comments and other garbage */
else
if(alstr[1] == ' ');
else
if(alstr[1] == '\n');
else
if(alstr[1] == '\t');
else
if(alstr[1] == '\0');
else {
al.name = strsep(&alstr," ");
al.real = strsep(&alstr,"\n");
if(strcmp(al.name,"fdelay") == 0);
else
printf("%s = %s\n",al.name,al.real);
}
}
}
printf("\n");
close((int)rfp);
return;
}
/* name says it all. find a single alias in the
* rc file.
*/
void findsinglealias(char *alias) {
FILE *rfp;
bool found = FALSE;
char buffer[BUFSIZ],*alstr;
struct alias al;
if(!(rfp = fopen(rcfile,"r")))
error("unable to open rc file",rcfile);
else {
while((alstr = fgets(buffer,BUFSIZ,rfp)) != NULL) {
if(alstr[1] == '#'); /* eat comments and other garbage */
else
if(alstr[1] == ' ');
else
if(alstr[1] == '\n');
else
if(alstr[1] == '\t');
else
if(alstr[1] == '\0');
else {
al.name = strsep(&alstr," ");
al.real = strsep(&alstr,"\n");
if(strcmp(alias,al.name) == 0) {
printf("%s\n",al.real);
found = TRUE;
}
else
if (strcmp(alias,al.real) == 0) {
printf("%s\n",al.name);
found = TRUE;
}
}
}
if(!found)
printf("%s: %s not found.\n",progname,alias);
}
if(rfp)
fclose(rfp);
return;
}